﻿using System;
namespace SimpleEvent {
    using System;
    /***********发布器类***********/
    public class EventTest {
        private int value;
        //定义 委托 
        public delegate void NumManipulationHandler();

        //定义事件
        public event NumManipulationHandler ChangeNum;
        protected virtual void OnNumChanged() {
            if (ChangeNum != null) {
                ChangeNum(); /* 事件被触发 */
            } else {
                Console.WriteLine("event not fire");
                Console.ReadKey(); /* 回车继续 */
            }
        }


        public EventTest() {
            int n = 5;
            SetValue(n);
        }


        public void SetValue(int n) {
            if (value != n) {
                value = n;
                OnNumChanged();
            }
        }
    }


    /***********订阅器类***********/

    public class subscribEvent {
        public void printf() {
            Console.WriteLine("event fire");
            Console.ReadKey(); /* 回车继续 */
        }
    }

    /***********触发***********/
    public class MainClass {
        public static void Main() {
            EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */
            subscribEvent v = new subscribEvent(); /* 实例化对象 */
            //给事件添加订阅
            //这里能调用委托并传递参数是因为定义的委托是没有参数的，所以可以传递一个没有接收参数的方法
            e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注册 */
            e.SetValue(7);
            e.SetValue(11);

            //上面的执行结果为，第一结果为 event not fire
            //是因为 首先调用的是 EventTest 无参构造，这个时候时间还没有订阅委托，事件就是null
            /*  event not fire
              event fire
              event fire*/


        }
    }
}